﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using BattleTank3D.Enums;

namespace BattleTank3D.Telas
{
    class GerenciadorTelas
    {
        EnumTelas TelaJogo;
        EnumTelas TelaJogoAnterior;

        /// <summary>
        /// Construtor que inicializa a tela atual e a tela anterior do inicio do jogo
        /// </summary>
        /// <param name="telaJogo">Tela que devera ser apresentada inicialmente</param>
        public GerenciadorTelas(EnumTelas telaJogo)
        {
            TelaJogo = telaJogo;
            TelaJogoAnterior = TelaJogo;
        }

        /// <summary>
        /// Metodo que gerencia todas as atualizações das telas
        /// </summary>
        /// <param name="telasDTO">objeto GerenciaTelaDTO que contem todas as telas do jogo</param>
        /// <param name="teclaPressionada">Objeto que possui o evento pressionado no teclado</param>
        /// <param name="teclaAnteriorPressionada">Objeto que possui o evento anterior ao pressionado do teclado</param>
        /// <param name="gameTime">Objeto GameTime</param>
        /// <param name="principal">Objeto Game</param>
        /// <param name="graphicsDevice">Objeto GraphicsDevice</param>
        public void Update(GerenciaTelaDTO telasDTO, KeyboardState teclaPressionada, KeyboardState teclaAnteriorPressionada, GameTime gameTime, Game principal, GraphicsDevice graphicsDevice)
        {

           
            switch (TelaJogo)
            {

                case EnumTelas.INTRODUCAO:
                    telasDTO.introducao.Update(gameTime, teclaPressionada, teclaAnteriorPressionada);

                    if (telasDTO.introducao.mediaPlayer.PlayPosition.TotalSeconds >= telasDTO.introducao.videoIntro.Duration.TotalSeconds - 1)
                    {
                        TelaJogo = EnumTelas.MENU;
                    }

                    if ((teclaPressionada.IsKeyDown(Keys.Space)) && !(teclaAnteriorPressionada.IsKeyDown(Keys.Space)))
                    {
                        TelaJogo = EnumTelas.MENU;
                    }

                    break;
                case EnumTelas.MENU:

                    if ((teclaPressionada.IsKeyDown(Keys.Escape)) && !(teclaAnteriorPressionada.IsKeyDown(Keys.Escape)))
                    {
                        principal.Exit();
                    }
                    if ((teclaPressionada.IsKeyDown(Keys.Down)) && !(teclaAnteriorPressionada.IsKeyDown(Keys.Down)))
                    {
                        //muda a opção selecionada
                        telasDTO.menuInicial.opcaoSelecionada++;
                    }
                    if ((teclaPressionada.IsKeyDown(Keys.Up)) && !(teclaAnteriorPressionada.IsKeyDown(Keys.Up)))
                    {
                        telasDTO.menuInicial.opcaoSelecionada--;
                    }
                    if ((teclaPressionada.IsKeyDown(Keys.Enter)) && !(teclaAnteriorPressionada.IsKeyDown(Keys.Enter)))
                    {
                        switch (telasDTO.menuInicial.opcaoSelecionada)
                        {
                            case (int)EnumOpcoes.JOGAR:

                                // Carrega as defincições do jogo
                                telasDTO.jogo.Initialize();

                                TelaJogo = EnumTelas.JOGO;
                                break;

                            //case (int)EnumOpcoes.OPCOES:
                            //    TelaJogo = EnumTelas.OPCOES;

                            //    break;

                            case (int)EnumOpcoes.CREDITOS:
                                TelaJogo = EnumTelas.CREDITOS;
                                break;

                            case (int)EnumOpcoes.SAIR:
                                principal.Exit();
                                break;

                        }

                    }
                    telasDTO.menuInicial.Update();
                    break;
                case EnumTelas.OPCOES:
                    if ((teclaPressionada.IsKeyDown(Keys.Escape)) && !(teclaAnteriorPressionada.IsKeyDown(Keys.Escape)))
                    {
                        TelaJogo = EnumTelas.MENU;
                    }
                    break;
                case EnumTelas.CREDITOS:
                    if ((teclaPressionada.IsKeyDown(Keys.Escape)) && !(teclaAnteriorPressionada.IsKeyDown(Keys.Escape)))
                    {
                        TelaJogo = EnumTelas.MENU;
                    }
                    break;
                case EnumTelas.GAMEOVER:

                    telasDTO.gameOver.Update(graphicsDevice);
                    if ((teclaPressionada.IsKeyDown(Keys.Escape)) && !(teclaAnteriorPressionada.IsKeyDown(Keys.Escape)))
                    {
                        TelaJogo = EnumTelas.MENU;
                    }
                    break;
                case EnumTelas.JOGO:

                    // Criar tratamento para caso ganhe ou perca o jogo
                    telasDTO.jogo.Update(teclaPressionada, teclaAnteriorPressionada, graphicsDevice, gameTime);

                    if ((teclaPressionada.IsKeyDown(Keys.P)) && !(teclaAnteriorPressionada.IsKeyDown(Keys.P)))
                    {
                        TelaJogoAnterior = TelaJogo;

                        TelaJogo = EnumTelas.PAUSE;
                    }

                    // Remover assim que entrar o jogo
                    if ((teclaPressionada.IsKeyDown(Keys.Escape)) && !(teclaAnteriorPressionada.IsKeyDown(Keys.Escape)))
                    {
                        TelaJogo = EnumTelas.GAMEOVER;
                    }

                    break;
                case EnumTelas.PAUSE:
                    if ((teclaPressionada.IsKeyDown(Keys.P)) && !(teclaAnteriorPressionada.IsKeyDown(Keys.P)))
                    {
                        TelaJogo = TelaJogoAnterior;
                    }

                    break;


            }

            
        }

        /// <summary>
        /// Metodo que gerencia a rederização de todas as telas
        /// </summary>
        /// <param name="telasDTO">objeto GerenciaTelaDTO que contem todas as telas do jogo</param>
        /// <param name="gameTime">objeto GameTime</param>
        /// <param name="defaultViewport">objeto Viewport</param>
        /// <param name="spriteBatch">objeto SpriteBatch que auxilia na apresentação da pontuação, mensagens, etc.</param>
        /// <param name="graphics">objeto GraphicsDeviceManager </param>
        /// <param name="window">objeto GameWindow</param>
        /// <param name="graphicsDevice">objeto GraphicsDevice</param>
        public void Draw(GerenciaTelaDTO telasDTO, GameTime gameTime, Viewport defaultViewport, SpriteBatch spriteBatch, GraphicsDeviceManager graphics, GameWindow window, GraphicsDevice graphicsDevice)
        {

            switch (TelaJogo)
            {
                case EnumTelas.INTRODUCAO:                    
                    telasDTO.introducao.Draw(gameTime, defaultViewport, spriteBatch);
                    break;

                case EnumTelas.MENU:                    
                    telasDTO.menuInicial.Draw(spriteBatch, graphics.PreferredBackBufferWidth, graphics.PreferredBackBufferHeight);
                    break;

                case EnumTelas.OPCOES:
                    telasDTO.opcoes.Draw(spriteBatch, window.ClientBounds.Width);
                    break;

                case EnumTelas.CREDITOS:
                    telasDTO.creditos.Draw(spriteBatch, window.ClientBounds.Width);
                    break;

                case EnumTelas.GAMEOVER:
                    telasDTO.gameOver.Draw(spriteBatch, window.ClientBounds.Width);
                    break;

                case EnumTelas.JOGO:
                    telasDTO.jogo.Draw(gameTime, graphicsDevice, defaultViewport);
                    break;

                case EnumTelas.PAUSE:
                    telasDTO.jogo.DrawPause(spriteBatch, window.ClientBounds.Width, window.ClientBounds.Height);
                    break;

            }
        }

    }
}
